package com.atguigu.gmall.activity.service;

import com.atguigu.gmall.activity.model.SeckillGoods;
import com.atguigu.gmall.activity.model.UserRecode;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.order.model.OrderInfo;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 *  业务接口类
 * @author atguigu
 * @since 2023-05-13
 */
public interface SeckillGoodsService extends IService<SeckillGoods> {

    /**
     * 查询Redis中当日秒杀商品列表
     *
     * @return
     */
    List<SeckillGoods> getSeckillGoodsList();

    /**
     * 查询指定秒杀商品信息
     * @param skuId
     * @return
     */
    SeckillGoods getSeckillGoods(Long skuId);

    /**
     * 点击秒杀按钮前,为当前登录用户生成购买指定商品抢购码,避免非法抢购
     * @param userId 用户ID
     * @param skuId 秒杀商品ID
     * @return
     */
    String getSeckillBuyCode(String userId, Long skuId);

    /**
     * 秒杀请求入队-将用户购买意向发送消息队列
     *
     * @param userId 用户ID
     * @param skuId   商品ID
     * @param userBuyCode 抢购码
     * @return
     */
    Result seckillRequestToQueue(String userId, Long skuId, String userBuyCode);

    /**
     * 监听秒杀队列中购买意向,完成秒杀核心业务-获取抢购资格
     *
     * @param userRecode 用户购买意向
     */
    void processSeckillRequest(UserRecode userRecode);

    /**
     * 扣减秒杀商品库存
     * @param skuId
     */
    void deductSecKillStock(Long skuId);

    /**
     * 检查秒杀商品结果
     * @param userId
     * @param skuId
     * @return
     */
    Result checkSeckillResult(String userId, Long skuId);

    /**
     * 汇总秒杀订单确认页面数据
     *
     * @param userId
     * @param skuId
     * @return
     */
    Map<String, Object> seckillOrderTrade(String userId, Long skuId);

    /**
     * 提交秒杀订单并且保存
     * @param orderInfo
     * @return
     */
    Long submitSeckillOrder(OrderInfo orderInfo);

    /**
     * 将当日产生秒杀缓存全部清理
     */
    void processCleanCache();
}
